知识点名称:本地服务通信和远程服务通信

编号: K6-5

前驱知识点编号:K6-1,K6-4

作者:刘凤华

讲义内容:

在Android系统中,服务的通信方式有两种,一种是本地服务通信,一种是远程服务通信。本地服务通信是指应用程序内部的通信,而远程服务通信是指两个应用程序之间的通信。使用这两种方式进行通信时必须满足一个前提,就是服务必须以绑定方式开启。

在使用服务进行本地通信时,首先需要开发一个Service在Android系统中,各个应用程序都运行在自己的进程中,进程之间一般无法直接进行通信,如果想要完成不同进程之间的通信,就需要使用远程服务通信。

远程服务通信是通过AIDL(Android Interface Definition Language)实现的,它是一种接口定义语言(Interface Definition Language),其语法格式非常简单,与Java中定义接口很相似,但是存在以下几点差异:

  • AIDL定义接口的源代码必须以.aidl结尾;
  • AIDL接口中用到的数据类型,除了基本数据类型、String、List、Map、CharSequence之外,其他类型全部都需要导入包,即使它们在同一个包中。

定义AIDL接口的示例代码如下:

package cn.itcast.service;
interface IService
{
     String getName();
     int getPrice();
}

定义好AIDL接口之后,接着需要在应用程序中创建Service的子类。该Service的onBind()方法所返回的IBinder对象应该是ADT所生成的IService.Stub的子类。具体代码如下所示:

public class MyService extends Service {
    //继承Iservice.stub
    private class IServiceBinder extends Stub{
        public String getName() throws RemoteException{
            return "zhangsan";
        }
        public int getPrice() throws RemoteException{
            return  100;
        }
    }
    public IBinder onBind(Intent intent) {
        // 第一步执行onBind方法
        return new IServiceBind();
    }
    public void onCreate(){
        super.onCreate();
    }
}

该类会提供一个IBinder onBind(Intent intent)方法,onBind()方法返回的IBinder对象会作为参数传递给ServiceConnection类中onServiceConnected(ComponentName name,IBinder service)方法,这样访问者就可以通过IBinder对象与Service进行通信。

results matching ""

    No results matching ""